package leetcode.weekly.week296;

import java.util.ArrayList;
import java.util.List;

public class TextEditor5 {
	Node head;
	Node cur;

	class Node {
		Node last;
		Node next;
		char c;

		public Node() {

		}

		public Node(char c) {
			this.c = c;
		}

		public Node insert(String text) {
			Node me = this;
			for (char c : text.toCharArray()) {
				Node node = new Node(c);
				node.next = me.next;
				if (me.next != null) {
					me.next.last = node;
				}
				me.next = node;
				node.last = me;
				me = node;
			}
			return me;
		}
	}

	public TextEditor5() {
		head = new Node();
		cur = head;
	}

	public void addText(String text) {
		cur = cur.insert(text);
		test();
	}

	private void test() {
		Node tmp = head.next;
		System.out.println("");
		while (tmp != null) {
			System.out.print(tmp.c + ",");
			tmp = tmp.next;
		}
		System.out.println("done");
	}

	public int deleteText(int k) {
		int ans = 0;
		while (cur != head && k > 0) {
			ans++;
			Node last = cur.last;
			last.next = cur.next;
			if (cur.next != null) {
				cur.next.last = last;
			}
			cur = last;
			k--;
		}
		test();
		return ans;
	}

	public String cursorLeft(int k) {
		while (cur != null && cur != head && k > 0) {
			cur = cur.last;
			k--;
		}
		Node tmp = cur;
		int cnt = 9;
		while (tmp != null && tmp.last != head && cnt > 0) {
			tmp = tmp.last;
			cnt--;
		}
		StringBuffer sb = new StringBuffer();
		while (tmp != null && tmp != cur.next) {
			sb.append(tmp.c);
			tmp = tmp.next;
		}
		return sb.toString();
	}

	public String cursorRight(int k) {
		while (cur != null && cur.next != null && k > 0) {
			cur = cur.next;
			k--;
		}
		test();
		Node tmp = cur;
		int cnt = 9;
		while (tmp != null && tmp.last != head && cnt > 0) {
			tmp = tmp.last;
			cnt--;
		}
		StringBuffer sb = new StringBuffer();
		while (tmp != null && tmp != null && tmp != cur.next) {
			sb.append(tmp.c);
			tmp = tmp.next;
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		TextEditor5 textEditor = new TextEditor5(); // 当前 text 为 "|" 。（'|' 字符表示光标）
		textEditor.addText("leetcode"); // 当前文本为 "leetcode|" 。
		textEditor.deleteText(4); // 返回 4
									// 当前文本为 "leet|" 。
									// 删除了 4 个字符。
		textEditor.addText("practice"); // 当前文本为 "leetpractice|" 。
		textEditor.cursorRight(3); // 返回 "etpractice"
									// 当前文本为 "leetpractice|".
									// 光标无法移动到文本以外，所以无法移动。
									// "etpractice" 是光标左边的 10 个字符。
		textEditor.cursorLeft(8); // 返回 "leet"
									// 当前文本为 "leet|practice" 。
									// "leet" 是光标左边的 min(10, 4) = 4 个字符。
		textEditor.deleteText(10); // 返回 4
									// 当前文本为 "|practice" 。
									// 只有 4 个字符被删除了。
		textEditor.cursorLeft(2); // 返回 ""
									// 当前文本为 "|practice" 。
									// 光标无法移动到文本以外，所以无法移动。
									// "" 是光标左边的 min(10, 0) = 0 个字符。
		String ans1  = textEditor.cursorRight(6); // 返回 "practi"
									// 当前文本为 "practi|ce" 。
									// "practi" 是光标左边的 min(10, 6) = 6 个字符。
		System.out.println(ans1);
	}
}
